home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (DO) / Nibble Volume 07, No. 06 (1986-06)(MicroSPARC)(Side A).zip / Nibble Volume 07, No. 06 (1986-06)(MicroSPARC)(Side A).do / VORATIO.BIN.S < prev    next >
Text File  |  1996-12-24  |  24KB  |  763 lines

  1. ********************************
  2. *        VORATIO.BIN           *
  3. *      BY DARRELL FETZER       *
  4. *       COPYRIGHT 1986         *
  5. *    BY MICROSPARC, INC.       *
  6. *    CONCORD, MA  01742        *
  7. *                              *
  8. * MERLIN ASSEMBLER             *
  9. ********************************
  10. LIFLOC    = $6E8
  11. LEVLOC    = $6F2
  12. SCLOC     = $6D9
  13. KEYSTR    = $C000
  14. KEYCLR    = $C010
  15. GRAPHIC   = $C050
  16. TEXT      = $C051
  17. MIXED     = $C053
  18. PAGE1     = $C054
  19. HIRES     = $C057
  20. RANDOM    = $EFAE        ;APPLESOFT RANDOM # ROUTINE
  21. HOME      = $FC58
  22. WAIT      = $FCA8
  23. SLNGH     = $6
  24. DEPTH     = $7
  25. ADDLEN    = $8
  26. LENGTH    = $9
  27. GRBUFFL2  = $19
  28. GRBUFFH2  = $1A
  29. PRINTL    = $1B
  30. PRINTH    = $1C
  31. HDPTR     = $1E
  32. *** $1F = HIGH BYTE OF 16-POINTER
  33. RNDL      = $9F
  34. RNDH      = $A0
  35. PITCH     = $CE
  36. TIME      = $CF
  37. R1        = $D6
  38. *** $D7 = HIGH BYTE OF 16-COUNTER
  39. DELTAX     =  $EB
  40. DELTAY    = $EC
  41. VECL      = $ED
  42. VECH      = $EE
  43. SHIFTER   = $EF
  44. X         = $F9          ;CURRENT X COORD OF HEAD
  45. Y         = $FA          ;CURRENT Y COORD. OF HEAD
  46. APCOUNT   = $FB
  47. GRBUFFL   = $FC
  48. GRBUFFH   = $FD
  49. XI        = $FE          ;X COORD. OF MOVEMENT VECTOR
  50. YJ        = $FF          ;Y COORD. OF MOVEMENT VECTOR
  51. WORM      = $6000
  52. VECPTRL   = $6065
  53. VECPTRR   = $6066
  54. VECTBL    = $6067
  55. TABL1     = $60C7
  56. LINE      = $60D4
  57. TBL4      = $60F5
  58. TBL5      = $60F9
  59. LCOUNT    = $60FD
  60. SPEED     = $60FE
  61. MX        = $60FF
  62. SEGLOC    = $6100
  63. MUSH      = $6200
  64. APPLE     = $6220
  65. TBL1      = $624F
  66. TBL2      = $630F
  67. TBL3      = $63CF
  68. XOFF      = $648F
  69. XBASE     = $65A7
  70. TABL2     = $66B8
  71. TABL3     = $66C5
  72. LEVEL1    = $66D2
  73. TABLEL    = $6984
  74. TABLEH    = $6997
  75. ********************************
  76.           ORG $69AA
  77. ***  DRAW BORDERS OF SCREEN AND
  78. ***  PUT INFO ON BOTTOM
  79. PROG      LDX #$00       ;START
  80. DRAW      LDY #$00       ;FILLS HIRES SCREEN SOLID WHITE
  81.           LDA TBL1,X
  82.           STA GRBUFFL
  83.           STA GRBUFFL2
  84.           LDA TBL2,X
  85.           STA GRBUFFH
  86.           LDA TBL3,X
  87.           STA GRBUFFH2
  88.           LDA #$7F
  89. DRAW1     STA (GRBUFFL),Y
  90.           STA (GRBUFFL2),Y
  91.           INY
  92.           CPY #$28
  93.           BCC DRAW1
  94.           INX
  95.           CPX #$A3
  96.           BLT DRAW
  97.           LDX #$00
  98. LUP3      LDY #$00       ;PUTS SCORE INFO ON THE BOTTOM OF THE TXT SCREEN
  99.           LDA TBL4,X
  100.           STA PRINTL
  101.           LDA TBL5,X
  102.           STA PRINTH
  103. LUP1      LDA #$20
  104.           STA (PRINTL),Y
  105.           INY
  106.           CPY #$28
  107.           BNE LUP1
  108.           INX
  109.           CPX #$04
  110.           BNE LUP3
  111.           JSR PSCRN      ;CLEARS THE MIDDLE OF THE SCREEN
  112.           BIT GRAPHIC
  113.           BIT  HIRES
  114.           BIT PAGE1
  115.           BIT  MIXED
  116.           LDA #>SCLOC
  117.           STA PRINTH
  118.           LDA #<SCLOC-6
  119.           STA PRINTL
  120.           LDX #$00
  121.           LDY #$00
  122. LUP2      LDA LINE,X
  123.           STA (PRINTL),Y
  124.           INX
  125.           INY
  126.           CPY #$21
  127.           BLT LUP2
  128. ***   SETUP VARIABLES
  129.           LDA #$FF       ;SET INTERNAL LEVEL COUNT TO -1
  130.           STA LCOUNT
  131.           LDA #>VECTBL
  132.           STA VECH
  133.           LDA #>SEGLOC
  134.           STA HDPTR+1
  135.           STA R1+1
  136.           LDA #<SEGLOC
  137.           STA R1
  138.           LDA #$F0       ;SET MINIMUM SPEED TO 240
  139.           STA MINSPD
  140.           LDA #$00       ;SET # OF POINTS FOR EATING APPLE TO BASE VALUE
  141.           STA POINT
  142. *** OUTSIDE LOOP. PROGRAM COMES
  143. *** HERE WHEN PLAYER MAKES NEW
  144. *** LEVEL.
  145. START1    INC LCOUNT     ;ADVANCE TO NEXT LEVEL
  146.           LDA LCOUNT
  147.           LSR            ;IF LEVEL IS ODD THEN POINTS PER APPLE INCREASES
  148.           BCS NO         ;OTHERWISE STAYS THE SAME
  149.           INC POINT
  150. NO        LDA #$00       ;SET DEATH ON LEVEL COUNTER TO 0
  151.           STA DIE?
  152.           SEC            ;INCREASE MINIMUM SPEED
  153.           LDA MINSPD
  154.           SBC #$05
  155.           STA SPEED      ;SAVE IT
  156.           STA MINSPD
  157.           INC LEVLOC+1   ;UPDATE INFO ON THE TEXT SCREEN
  158.           LDA LEVLOC+1
  159.           CMP #':
  160.           BNE START
  161.           LDA #'0
  162.           STA LEVLOC+1
  163.           INC LEVLOC
  164.           LDA LEVLOC
  165.           CMP #'2        ;IF PLAYER MAKES IT TO LEVEL 20
  166.           BNE START
  167.           JMP EXIT       ;RETURN TO BASIC
  168. ***  INSIDE LOOP. PLAYER COMES
  169. ***  HERE WHEN HE DIES.
  170. START     JSR PSCRN      ;CLEAR WRECKAGE FROM SCREEN
  171.           JSR LEVELSET   ;SET BARRICADES ON SCREEN
  172.           LDA MINSPD     ;SET PLAYERS CURRENT SPEED
  173.           STA SPEED      ;TO MINIMUM
  174.           LDA #$03       ;SET DIRECTION VECTOR TO 3,0
  175.           STA XI
  176.           LDA #$00
  177.           STA YJ
  178.           LDA VECTBL     ;SET LINKED LIST POINTERS TO CORRESPOND
  179.           STA VECPTRL    ;TO THE 3,0 INITIALIZATION
  180.           LDA VECTBL+3
  181.           STA VECPTRR
  182.           LDA #$0A       ;SET THE # OF APPLES TO BE EATEN ON A LEVEL TO
  183.           STA APCOUNT    ;TEN
  184.           LDA #$01       ;SET THE LENGTH OF THE WORM TO 1
  185.           STA LENGTH
  186.           LDA #$09       ;SET THE # OF SEGMENTS TO BE ADDED TO 9
  187.           STA ADDLEN
  188.           LDA #<SEGLOC   ;SET THE HEAD POINTER TO THE TOP OF THE QUEUE
  189.           STA HDPTR
  190.           LDA #$15       ;SET INITIAL X COORD TO 15
  191.           LDY #$00
  192.           STA (HDPTR),Y  ;SAVE ON QUEUE
  193.           STA X          ;AND IN CURRENT HEAD POSITION
  194.           INY
  195.           LDA #$94       ;SET INITIAL Y COORD TO 148
  196.           STA (HDPTR),Y  ;SAVE ON QUEUE
  197.           STA Y          ;AND IN CURRENT HEAD POSITION
  198.           JSR SEGSET     ;DRAW THE HEAD
  199.           JSR MSAFE      ;DRAW A MUSHROOM IN A SAFE PLACE
  200.           JSR SAFE       ;DRAW AN APPLE IN A SAFE PLACE
  201.           BIT KEYCLR     ;CLEAR STROBE
  202.           LDA KEYSTR     ;WAIT FOR A KEY PRESS (K.P.) TO START GAME
  203.           BPL *-3
  204. ***  ALL CONTROL OF WORM TAKES
  205. ***  PLACE IN THIS LOOP
  206. WAIT1     LDA KEYSTR     ;GET FIRST COMMAND
  207.           BPL NOKEY      ;NO COMMAND ACT IN CURRENT DIRECTION
  208.           CMP #$9B       ;ESCAPE
  209.           BNE KEY1       ;NO, TEST NEXT KEY
  210.           JMP EXIT       ;EXIT TO BASIC
  211. KEY1      CMP #$A0       ;SPACE
  212.           BNE KEY2       ;NO, GO TO NEXT TEST
  213.           BIT KEYCLR     ;CLEAR STROBE
  214.           LDA KEYSTR     ;WAIT FOR ANOTHER K.P. TO UNFREEZE GAME
  215.           BPL *-3        ;NO KEY
  216. KEY2      CMP #"L        ;WAS IT AN L
  217.           BNE KEY3       ;NOPE
  218.           BIT KEYCLR     ;CLEAR STROBE
  219.           JMP START1     ;JMP TO SET UP FOR NEXT LEVEL
  220. KEY3      JSR MOVMNT     ;INTERPRET K.P. AS MOVEMENT COMMAND
  221. NOKEY     BIT KEYCLR     ;CLEAR STROBE
  222.           JSR POSUPD     ;UPDATE WORM'S POSITION
  223.           LDA COLL       ;LOAD COLLISION COUNTER
  224.           BNE MOLIFE     ;IF NONZERO COLLISION OCCURED
  225.           LDA SPEED      ;OTHERWISE GET CURR. SPEED
  226.           JSR WAIT       ;AND WAIT
  227.           LDA APCOUNT    ;GET # OF APPLES LEFT OF ORIG. TEN
  228.           BNE NOTEN      ;NONZERO # LEFT GO FOR MORE
  229.           LDA DIE?       ;DONE WITH LEVEL. DID PLAYER DIE ON LEVEL EVER
  230.           BNE DIETEN     ;NONZERO = YES AND NO BONUS
  231.           LDY #$0A       ;NO DEATH IS REWARDED WITH 1000 PT. BONUS
  232. MBONUS    JSR SCORE1     ;ADD 100 TO SCORE
  233.           DEY
  234.           BNE MBONUS     ;MORE SCORE TO GIVE IF NOT DONE WITH 1000 PTS
  235. DIETEN    JMP START1     ;GO TO NEXT LEVEL
  236. NOTEN     JMP WAIT1      ;GET ANOTHER K.P.
  237. ***  START OF SUBROUTINES
  238. MOLIFE    LDA #$20       ;SET UP FOR THE DEATH SOUND
  239.           STA PITCH
  240.           LDA #$00
  241.           STA EPITCH
  242.           LDA #$03
  243.           STA TIME1
  244.           JSR SOUND
  245.           LDX LIFLOC
  246.           DEX            ;DECREASE THE NUMBER OF LIVES THE PLAYER HAS
  247.           CPX #'/        ;IS IT LESS THAN ZERO
  248.           BEQ EXIT       ;IF YES THAN THE GAME IS OVER
  249.           STX LIFLOC     ;OTHERWISE SAVE HIS CURRENT # OF LIVES ON SCRN.
  250.           LDA KEYSTR     ;WAIT FOR K.P.
  251.           BPL *-3
  252.           INC DIE?       ;INCREMENT DEATH ON LEVEL COUNTER (NO BONUS)
  253.           JMP START      ;ERASE SCREEN AND START LEVEL AGAIN
  254. EXIT      BIT KEYCLR
  255.           JSR HOME       ;CLEAR TEXT SCREEN
  256.           LDA TEXT       ;TEXT DISPLAY
  257.           RTS            ;RETURN TO BASIC
  258. *** MOVEMENT ROUTINE INTERPRETS
  259. *** KEYSTROKE AND GETS THE PROPER
  260. *** VALUE FROM THE LINKED LIST
  261. MOVMNT    CMP #"J        ;IS K.P. A J
  262.           BNE NEXT       ;NO TRY ANOTHER TEST
  263.           LDA VECPTRL    ;J MEANS LEFT SO GET LEFT POINTER FOR LINKED LIST
  264.           STA VECL       ;AND SAVE IT
  265.           LDY #$00
  266.           LDA (VECL),Y   ;LOAD NEX LEFT POINTER FROM LINKED LIST
  267.           STA VECPTRL    ;SAVE IN LEFT POINTER
  268.           INY
  269.           LDA (VECL),Y   ;GET X COORD OF DIRECTION VECTOR
  270.           STA XI         ;SAVE IN X COORD OF MOVEMENT VECTOR
  271.           INY
  272.           LDA (VECL),Y   ;GET Y COORD.
  273.           STA YJ         ;AND SAVE
  274.           INY
  275.           LDA (VECL),Y   ;GET NEW RIGHT POINTER FOR L.L.
  276.           STA VECPTRR    ;SAVE IT
  277.           BCC OVER       ;BRANCH ALWAYS BECAUSE K.P. WAS "J"
  278. NEXT      CMP #"K
  279.           BNE NEXT2      ;NOT A K TRY ANOTHER TEST
  280.           LDA VECPTRR    ;K IS RIGHT SO GET RIGHT POINTER FOR L.L.
  281.           STA VECL       ;SAVE FOR INDIRECT ADDRESSING
  282.           LDY #$00
  283.           LDA (VECL),Y   ;GET NEW LEFT L.L. POINTER
  284.           STA VECPTRL
  285.           INY
  286.           LDA (VECL),Y   ;GET X COORD
  287.           STA XI
  288.           INY
  289.           LDA (VECL),Y   ;Y COORD
  290.           STA YJ
  291.           INY
  292.           LDA (VECL),Y   ;NEW RIGHT POINTER
  293.           STA VECPTRR
  294.           BCC OVER       ;BRANCH ALWAYS
  295. NEXT2     CMP #"F        ;WAS K.P. AN F
  296.           BNE NEXT3      ;TRY ANOTHER
  297.           LDA SPEED      ;GET CURRENT SPEED
  298.           CMP #$10       ;IS IT AT A MAX.
  299.           BLT OVER       ;YES SO IGNORE COMMAND
  300.           SEC
  301.           SBC #$0A       ;INCREASE SPEED BY TEN
  302.           STA SPEED
  303.           BCC OVER       ;BRANCH ALWAYS
  304. NEXT3     CMP #"D        ;IS K.P. A D
  305.           BNE OVER       ;NOPE SO K.P. WAS MEANINGLESS
  306.           LDA SPEED      ;GET CURRENT SPEED
  307.           CMP MINSPD     ;IS IT AT A MIN.
  308.           BGE OVER       ;YES, IGNORE COMMAND
  309.           CLC
  310.           ADC #$0A       ;OTHERWISE DECREASE SPEED BY 10
  311.           STA SPEED
  312. OVER      RTS            ;GET OUT OF HERE
  313. *** POSITION UPDATE. UPDATES THE
  314. *** POSITION OF THE WORM IN
  315. *** ACCORD WITH DATA FROM MOVEMENT
  316. *** OR IF NO KEY WAS PRESSED, WORM
  317. *** CONTINUES WITH CURRENT PATH
  318. POSUPD    LDA ADDLEN     ;GET # OF SEGMENTS TO ADD TO BACK OF WORM
  319.           CMP #$00       ;= 0 SO GOTO QUEUE UPDATE
  320.           BEQ EQUAL
  321.           BGE GREATER    ;>0 SO ADD SEGMENTS TO BACK
  322. EQUAL     LDY #$00
  323.           LDA (R1),Y     ;GET TOP VALUE FROM QUEUE
  324.           STA X          ;SAVE FOR ERASE SUBROUTINE
  325.           INY
  326.           LDA (R1),Y     ;GET NEXT VALUE
  327.           STA Y
  328.           JSR SEGCLR     ;CLEAR SEGMENT FROM THE BACK OF THE WORM
  329.           LDY #$00
  330.           LDX LENGTH     ;GET CURRENT LENGTH
  331.           DEX            ;AND DECREASE BY TWO SINCE A SEGMENT WAS ERASED
  332. *** MAINTAINS QUEUE WHICH KEEPS
  333. *** TRACK OF ALL THE DIFFERENT
  334. *** POSITIONS THE WORM HAS BEEN IN
  335. QUEUE     LDA SEGLOC+2,Y ;LOAD 3RD,Y AND
  336.           STA SEGLOC,Y   ;STORE IT AT 0,Y POSITION IN THE QUEUE
  337.           INY
  338.           LDA SEGLOC+2,Y ;GET 3RD,Y AND
  339.           STA SEGLOC,Y   ;STORE IT AT 1ST,Y POSITION OF QUEUE
  340.           INY
  341.           DEX            ;X REG CONTAINS LENGTH OF WORM TO DECREASE
  342.           BNE QUEUE      ;DONE WITH ALL SEGMENTS OF WORM IF <>0 THEN NO
  343.           CLC
  344.           BCC LESSER     ;BRANCH ALWAYS
  345. GREATER   DEC ADDLEN     ;DEC # OF SEGMENTS TO ADD
  346.           INC LENGTH     ;INC LENGTH OF WORM
  347.           INC HDPTR      ;ADD TWO TO QUEUE HEAD POINTER
  348.           INC HDPTR
  349. LESSER    LDY #$00
  350.           DEC HDPTR      ;SUBTRACT TWO FROM HEAD POINTER
  351.           DEC HDPTR
  352.           LDA (HDPTR),Y  ;GET COORD OF SEGMENT BEHIND THE CURRENT HEAD
  353.           STA X          ;SAVE THEM
  354.           PHA            ; AND PUSH THEM ONTO STACK FOR LATER USE
  355.           INC HDPTR
  356.           LDA (HDPTR),Y  ;GET Y COORD AND
  357.           STA Y          ;SAVE AND
  358.           PHA            ;PUSH IT ALSO
  359.           INC HDPTR
  360.           LDA #$EA       ;NOP ERASING THE HEAD ON HIRES 1
  361.           STA DEL
  362.           STA DEL+1
  363.           STA DEL1
  364.           STA DEL1+1
  365.           JSR SEGCLR     ;ERASE SEGMENT ON PAGE 2
  366.           LDY #$00
  367.           CLC
  368.           LDA X          ;GET CURRENT HEAD POS
  369.           ADC XI         ;AND ADD X DIREC. VECTOR
  370.           STA X          ;SAVE IT
  371.           STA (HDPTR),Y  ;PUT ON THE BACK OF THE QUEUE
  372.           INY
  373.           CLC
  374.           LDA Y          ;GET CURR. Y
  375.           ADC YJ         ;ADD Y DIR. VECTOR
  376.           STA Y          ;SAVE AND
  377.           STA (HDPTR),Y  ;PUT ON BACK OF QUEUE
  378.           JSR SEGTST     ;TEST IF NEW HEAD WILL HIT ANYTHING
  379.           LDA COLL       ;GET COLLISION COUNTER
  380.           BEQ NOCOLL     ;EQUALS ZERO THAT'S GOOD
  381.           JSR MORE1      ;ERASE THE APPLE AT ITS CURR. POSITION
  382.           JSR SEGTST     ;TEST NEW HEAD AGAIN
  383.           LDA COLL       ;TRY THE COLL. COUNTER AGAIN
  384.           BNE DEAD       ;NONZERO THIS TIME AND YOU DIE
  385.           LDY POINT      ;FIND OUT HOW MANY POINTS THE APPLE IS WORTH
  386. SCORUP    JSR SCORE      ;AND UPDATE THE SCORE ACCORDINGLY
  387.           DEY
  388.           BNE SCORUP
  389.           LDA #$60       ;SET UP FOR NOISE FOR HITTING APPLE
  390.           STA PITCH
  391.           LDA #$64
  392.           STA EPITCH
  393.           LDA #$03
  394.           STA TIME1
  395.           JSR SOUND
  396.           DEC APCOUNT    ;ONE LESS APPLE TO EAT
  397.           BNE ADDL       ;DONE WITH ALL TEN YET
  398.           CLC
  399.           BCC NOCOLL     ;SKIP OVER DIE ROUTINE
  400. ADDL      JSR MSAFE      ;DRAW NEW MUSHROOM
  401.           JSR SAFE       ;DRAW NEW APPLE
  402.           CLC
  403.           LDA ADDLEN     ;ADD 5 SEGMENTS TO WORM
  404.           ADC #$05
  405.           STA ADDLEN
  406.           CLC
  407.           BCC NOCOLL     ;SKIP DIE SEQUENCE
  408. DEAD      JSR MORE1      ;REDRAW APPLE SINCE IT DID NOT CAUSE COLLISION
  409. NOCOLL    LDA #$91       ;RESTORE SEGMENT ROUTINE TO NORMAL AFTER NOPS
  410.           STA DEL
  411.           STA DEL1
  412.           LDA #GRBUFFL
  413.           STA DEL+1
  414.           STA DEL1+1
  415.           JSR SEGSET     ;FINALLY DRAW THE NEW HEAD
  416.           PLA            ;GET COORD. OF HEAD SEGMENT THAT WAS ERASED
  417.           STA Y          ;AND REDAW IT.
  418.           PLA
  419.           STA X
  420.           JSR SEGSET
  421. *** SEGSET,SEGCLR AND SEGTST
  422. *** DO ALL OPERATIONS ON THE
  423. *** WORM ITSELF.
  424. SEGSET    JSR SSETUP     ;GET PROPER SHIFTED SHAPE
  425. SDRAW     LDY DELTAY     ;GET CURRENT Y OFFSET
  426.           JSR XYCALC     ;CALCULATE MEMORY ADDRESS FOR HEAD
  427.           LDY #$00
  428.           LDA WORM,X     ;GET WORM'S SHAPE FROM TABLE
  429.           ORA (GRBUFFL2),Y ;USE ORA FOR OVERLAPPING SEGMENTS
  430.           STA (GRBUFFL),Y ;STORE ON PAGE 1
  431.           STA (GRBUFFL2),Y ;AND ON PAGE 2
  432.           INY
  433.           INX
  434.           LDA WORM,X     ;SAME AS ABOVE SINCE THE WORM IS TWO BYTES WIDE
  435.           ORA (GRBUFFL2),Y
  436.           STA (GRBUFFL),Y
  437.           STA (GRBUFFL2),Y
  438.           INX
  439.           INY
  440.           INC DELTAY     ;GO TO NEXT LINE ON SCREEN
  441.           DEC DEPTH      ;DONE WITH SHAPE YET?
  442.           BNE SDRAW      ;NO KEEP DOING MORE
  443.           RTS
  444. SEGTST    LDA #$00       ;INITIALIZE COLLISION COUNTER
  445.           STA COLL
  446.           JSR SSETUP     ;GET SHIFTED SHAPE
  447. STST      LDY DELTAY
  448.           JSR XYCALC     ;CALCULATE MEMORY ADDRESS
  449.           LDY #$00
  450.           LDA WORM,X
  451.           AND (GRBUFFL2),Y ;TEST PAGE TWO FOR COLLISIONS
  452.           BEQ SKIP       ;NONE GO ON
  453.           INC COLL       ;HIT SOMETHING INCREASE COLL
  454. SKIP      INX
  455.           INY
  456.           LDA WORM,X
  457.           AND (GRBUFFL2),Y ;DO THE SAME FOR THE SECOND BYTE OF WORM
  458.           BEQ SKIP1
  459.           INC COLL
  460. SKIP1     INX
  461.           INC DELTAY
  462.           DEC DEPTH
  463.           BNE STST
  464.           RTS
  465. SEGCLR    JSR SSETUP     ;CALCULATE OFFSET
  466. SCLR      LDY DELTAY
  467.           JSR XYCALC
  468.           LDY #$00
  469.           LDA WORM,X
  470.           EOR #$FF       ;COMPLEMENT WORM'S SHAPE
  471.           AND (GRBUFFL),Y ;TO SIMULTATE A BIT CLEAR ROUTINE.
  472. DEL       STA (GRBUFFL),Y ;A BIC OPCODE ON SOME MACHINES (PDP-11)
  473.           STA (GRBUFFL2),Y ;EOR CAN NOT BE USED TO ERASE SHAPES BECAUSE
  474.           INY            ;OF THE OVERLAP IN THE SHAPES
  475.           INX
  476.           LDA WORM,X
  477.           EOR #$FF
  478.           AND (GRBUFFL),Y
  479. DEL1      STA (GRBUFFL),Y
  480.           STA (GRBUFFL2),Y
  481.           INY
  482.           INX
  483.           INC DELTAY
  484.           DEC DEPTH
  485.           BNE SCLR
  486.           RTS
  487. SSETUP    LDX X          ;GET COORD. THAT WERE PASSED IN X,Y REG.
  488.           LDY Y
  489.           LDA XBASE,X    ;GET THE BYTE OFFSET FROM TABLE
  490.           STA DELTAX
  491.           LDA XOFF,X     ;GET THE BIT OFFSET FOR THE SHAPE
  492.           TAX
  493.           STY DELTAY     ;STORE ABSOLUTE Y COORD.
  494.           LDA #$07
  495.           STA DEPTH
  496.           RTS
  497. XYCALC    LDA TBL1,Y     ;READS ADDRESS TABLES.
  498.           CLC
  499.           ADC DELTAX
  500.           STA GRBUFFL
  501.           STA GRBUFFL2
  502.           LDA TBL2,Y
  503.           STA GRBUFFH
  504.           LDA TBL3,Y
  505.           STA GRBUFFH2
  506.           RTS
  507. *** SHAPESET DRAWS EITHER A MUSH-
  508. *** ROOM OR AN APPLE DEPENDING
  509. *** ON THE ADDRESS AT SHAPEL &
  510. *** SHAPEH. WORKS THE SAME AS THE
  511. *** OTHER SHAPE DRAWING ROUTINE
  512. SHAPESET  JSR SHSETUP
  513. SHDRAW    LDY DELTAY
  514.           JSR XYCALC
  515.           LDY #$00
  516. SHDRAW2   INX
  517. NAME      LDA MUSH,X
  518.           EOR (GRBUFFL2),Y
  519.           STA (GRBUFFL),Y
  520.           STA (GRBUFFL2),Y
  521.           INY
  522.           CPY SLNGH
  523.           BNE SHDRAW2
  524.           INC DELTAY
  525.           CPX DEPTH
  526.           BLT SHDRAW
  527.           RTS
  528. SHSETUP   STX DELTAX
  529.           STY DELTAY
  530.           LDX #$00
  531. NAME1     LDA MUSH,X
  532.           STA SLNGH
  533.           INX
  534. NAME3     LDA MUSH,X
  535.           STA DEPTH
  536.           RTS
  537. SHTEST    LDA #$00       ;TEST TO SEE WHETHER THE SHAPE WILL BE
  538.           STA AMCOLL     ;PLOTTED ON TOP OF SOMETHING ELSE
  539.           JSR SHSETUP    ;IF IT IS SAFE THEN AMCOLL RETURNS A ZERO
  540. SHTEST1   LDY DELTAY     ;OTHERWISE IT IS NONZERO
  541.           JSR XYCALC
  542.           LDY #$00
  543. SHTEST2   INX
  544. NAME2     LDA MUSH,X
  545.           AND (GRBUFFL),Y
  546.           BEQ SKIP2
  547.           INC AMCOLL
  548. SKIP2     INY
  549.           CPY SLNGH
  550.           BNE SHTEST2
  551.           INC DELTAY
  552.           CPX #$2B
  553.           BLT SHTEST1
  554.           RTS
  555. *** MSAFE & SAFE FIND A PLACE
  556. *** ON THE SCREEN FOR THE MUSH-
  557. *** ROOMS AND APPLES THAT IS NOT
  558. *** ALREADY OCCUPIED
  559. MSAFE     JSR RANDOM     ;CALLS APPLESOFT RANDOM ROUTINE
  560.           LDA RNDL       ;GET RND #
  561.           AND #$1F       ;MASKS OUT TOP FOUR BITS
  562.           CLC
  563.           ADC #$04       ;ADDS FOUR TO GIVE A VALUE BETWEEN 4 AND 20
  564.           STA MX         ;SAVE IN X COORD. FOR SHAPE
  565.           TAX
  566.           LDA RNDH       ;GETS OTHER RND #
  567.           AND #$7F       ;MASKS OUT HIGH BIT
  568.           CLC            ;ADDS 10
  569.           ADC #$0A       ; TO GIVE A VALUE BETWEEN 10 AND 138
  570.           STA MY         ;SAVE IN Y COORD
  571.           TAY
  572.           LDA #<MUSH     ;INSTUCT DRAW ROUTINE THAT IT IS TO
  573.           STA NAME+1     ;DRAW A MUSHROOM
  574.           STA NAME1+1
  575.           STA NAME2+1
  576.           STA NAME3+1
  577.           JSR SHTEST     ;TEST SHAPE AREA
  578.           LDA AMCOLL     ;IS THERE A COLLISION
  579.           BEQ MORE       ;NO THEN GO ON
  580.           CLC
  581.           BCC MSAFE      ;YES, GET NEW COORD. AND TRY AGAIN
  582. MORE      LDX MX         ;GET (X,Y) OF MUSHROOM
  583.           LDY MY
  584.           JSR SHAPESET   ;AND DRAW IT
  585.           RTS
  586. SAFE      JSR RANDOM     ;SAFE WORKS THE SAME AS THE MSAFE ROUTINE
  587.           LDA RNDL       ;EXCEPT THAT THE RANDOM X IS ALWAYS AN EVEN #
  588.           AND #$1E       ;FOR A POSSIBLE COLOR APPLE AS A MODIFICATION
  589.           CLC
  590.           ADC #$04
  591.           CMP AX
  592.           BEQ SAFE
  593.           STA AX
  594.           TAX
  595.           LDA RNDH
  596.           AND #$7F
  597.           CLC
  598.           ADC #$0A
  599.           STA AY
  600.           TAY
  601.           LDA #<APPLE
  602.           STA NAME+1
  603.           STA NAME1+1
  604.           STA NAME2+1
  605.           STA NAME3+1
  606.           JSR SHTEST
  607.           LDA AMCOLL
  608.           BEQ MORE1
  609.           CLC
  610.           BCC SAFE
  611. MORE1     LDX AX
  612.           LDY AY
  613.           JSR SHAPESET
  614.           RTS
  615. *** PARTIAL SCREEN CLEARS THE
  616. *** MIDDLE OF THE SCREEN. IT IS
  617. *** USED BETWEEN LEVELS.
  618. PSCRN     LDX #$07       ;START SEVEN LINES DOWN BECAUSE OF THE BORDER
  619. NXTLIN    LDA TBL1,X
  620.           STA GRBUFFL
  621.           STA GRBUFFL2
  622.           LDA TBL2,X
  623.           STA GRBUFFH
  624.           LDA TBL3,X
  625.           STA GRBUFFH2
  626.           LDY #$02       ;START TWO BYTES OVER IN THE X DIREC. AGAIN BORD.
  627. NDONE     LDA #$00       ;STORE ZEROS TO CLEAR
  628.           STA (GRBUFFL),Y
  629.           STA (GRBUFFL2),Y
  630.           INY
  631.           CPY #$26       ;UNTIL THE 38TH BYTE. LEAVES 2 BYTE BORDER
  632.           BNE NDONE
  633.           INX
  634.           CPX #$A0
  635.           BNE NXTLIN
  636.           RTS
  637. *** LEVELSET SETS UP THE LEVEL
  638. *** ACCORDING TO THE TEMPLATES
  639. *** LEVEL1,LEVEL2 ETC. IN THE
  640. *** THE TEMPLATES, IF A BIT IS
  641. *** ON THEN A BLOCK 7X7 PIXELS
  642. *** WILL BE DRAWN AT THAT
  643. *** LOCATION.
  644. LEVELSET  LDY LCOUNT     ;GET CURRENT LEVEL
  645.           LDA TABLEL,Y   ;GET ADDRESS OF CURRENT LEVEL TEMPLATE
  646.           STA NODONE1+1
  647.           LDA TABLEH,Y
  648.           STA NODONE1+2
  649.           LDY #$00
  650.           STY COUNT
  651.           STY VERT
  652.           LDA #$03       ;THREE BYTES MAKE ONE ROW (24 BITS)
  653.           STA FINISH1
  654. NODONE3   LDX VERT       ;GET STARTING ADDRESS FROM ABBREV. LOOKUP TAB.
  655.           LDA TABL1,X
  656.           STA GRBUFFL
  657.           STA GRBUFFL2
  658.           LDA TABL2,X
  659.           STA GRBUFFH
  660.           LDA TABL3,X
  661.           STA GRBUFFH2
  662.           CLC
  663.           ADC #$20       ;H BYTE OF ADDRESS TO STOP AT
  664.           STA FINISH
  665. NODONE2   LDX COUNT
  666.           LDY #$00
  667. NODONE1   LDA LEVEL1,X   ;GET BYTES OF TEMPLATE
  668.           STA SHIFTER
  669.           LDA #$08       ;EIGHT BITS IN A BYTE
  670.           STA POS
  671. NODONE    ASL SHIFTER    ;SHIFT BITS INTO CARRY FLAG THEN TEST TO SEE
  672.           BCC ZERO       ;IF BITS ARE SET. IF NOT THE BRANCH
  673.           LDA #$7F       ;OTHERWISE FILL THE BYTE ON SCREEN
  674.           STA (GRBUFFL),Y
  675.           STA (GRBUFFL2),Y
  676. ZERO      INY            ;GO ON TO NEXT BIT
  677.           DEC POS        ;DONE WITH ALL EIGHT YET?
  678.           BNE NODONE     ;NO THEN GO FINISH
  679.           INX            ;DONE WITH THREE BYTES YET
  680.           CPX FINISH1    ;NO THEN GO DO THAT
  681.           BNE NODONE1
  682.           CLC
  683.           LDA GRBUFFH    ;CALCULATE NEXT HIRES ADDRESS RATHER THAN
  684.           ADC #$04       ;LOOKING UP
  685.           STA GRBUFFH
  686.           CMP FINISH     ;COMPARE TO FINISHING ADDRESS
  687.           BNE NODONE2    ;NOT DONE YET DO MORE
  688.           LDA FINISH1    ;STORE OLD FINISH MARKER IN COUNT
  689.           STA COUNT
  690.           CLC
  691.           ADC #$03       ;UPDATE FINISH MARKER BY THREES TO KEEP TRACK
  692.           STA FINISH1    ;OF THE END OF ROWS
  693.           INC VERT       ;NEXT LINE
  694.           LDA VERT
  695.           CMP #$0C       ;DONE WITH ALL TWELVE YET?
  696.           BNE NODONE3    ;NO THEN GO BACK
  697.           RTS
  698. SCORE1    LDA #$40       ;SET UP SOUND ROUTINE
  699.           STA PITCH      ;FOR A BONUS SCORE
  700.           LDA #$44
  701.           STA EPITCH
  702.           LDA #$10
  703.           STA TIME1
  704.           STY TEMP
  705.           JSR SOUND
  706.           LDY TEMP
  707.           LDA #$A0
  708.           JSR WAIT
  709. SCORE     LDX #$03
  710. MOSCO     INC SCLOC,X    ;KEEP SCORE DIRECTLY ON THE SCREEN BY
  711.           LDA SCLOC,X    ;INCREMENTING SCREEN LOCATIONS
  712.           CMP #':
  713.           BNE MORSC
  714.           LDA #'0
  715.           STA SCLOC,X
  716.           DEX
  717.           CPX #$01       ;IF THE PLAYER GETS 10000 PTS
  718.           BNE MOSCO
  719.           INC LIFLOC     ;GIVE HIM ANOTHER LIFE
  720.           CLC
  721.           BCC MOSCO
  722. MORSC     RTS
  723. *** SOUND IS THE GENERAL PURPOSE
  724. *** SOUND ROUTINE THAT GENERATES
  725. *** A TONE OR SERIES OF TONES
  726. *** DEPENDING ON THE VALUES OF
  727. *** PITCH,TIME AND EPITCH (END-
  728. *** PITCH)
  729. SOUND     LDA TIME1
  730.           STA TIME
  731. SOUND1    LDX PITCH
  732.           LDA $C030
  733. SOUND2    DEY
  734.           BNE SOUND3
  735.           DEC TIME
  736.           BEQ TEST
  737. SOUND3    DEX
  738.           BNE SOUND2
  739.           BEQ SOUND1
  740. TEST      LDA PITCH
  741.           CLC
  742.           ADC #$04
  743.           STA PITCH
  744.           CMP EPITCH
  745.           BNE SOUND
  746.           RTS
  747. MY        HEX 00
  748. MINSPD    HEX 00
  749. AMCOLL    HEX 00
  750. POS       HEX 00
  751. COUNT     HEX 00
  752. FINISH    HEX 00
  753. VERT      HEX 00
  754. AX        HEX 00
  755. AY        HEX 00
  756. COLL      HEX 00
  757. TEMP      HEX 00
  758. DIE?      HEX 00
  759. EPITCH    HEX 00
  760. TIME1     HEX 00
  761. POINT     HEX 00
  762. FINISH1   HEX 00
  763.